import axios from 'axios'
import store from '@/store/index.js';
import JSONbig from 'json-bigint'
import router from '@/routers/index.js'
import {
  Toast
} from 'vant';

const request = axios.create({
  baseURL: "http://toutiao.itheima.net",
  transformResponse: [function (data) {
    try {
      // 如果转换成功则返回转换的数据结果
      return JSONbig.parse(data)
    } catch (err) {
      // 如果转换失败，则包装为统一数据格式并返回
      return {
        data
      }
    }
  }]
})

const refreshToken = axios.create({
  baseURL: "http://toutiao.itheima.net",
})

/* 请求拦截器-统一处理token */
request.interceptors.request.use(function (config) {
  // 在发送请求之前做些什么，例如加入token
  const {
    userInfo
  } = store.state
  if (userInfo)
    config.headers.Authorization = `Bearer ${userInfo.token}`
  return config;
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error);
});


// 响应拦截器
request.interceptors.response.use(res => {
  // 处理响应成功的
  return res
}, async err => {
  // 处理响应失败的
  const status = err.response.status
  if (status === 400) {
    Toast.fail('客户端请求参数错误')
  } else if (status === 401) {
    // token无效操作

    // 1.如果没有user登录,直接跳转到登录页
    const {
      userInfo
    } = store.state
    if (!userInfo || !userInfo.token) {
      Toast.fail("请先登录")
      return redirectLogin()
    }

    // 2.token过期,更新token
    try {
      const {
        data
      } = await refreshToken({
        method: 'PUT',
        url: '/v1_0/authorizations',
        headers: {
          Authorization: `Bearer ${userInfo.refresh_token}`
        }
      })
      userInfo.token = data.data.token
      store.commit('setUser', userInfo)

      // 3.更新完token后继续请求
      return request(err.config)
    } catch (err) {
      redirectLogin()
    }
  } else if (status >= 500) {
    Toast.fail('服务器异常')
  }
  return Promise.reject(err)
})

function redirectLogin() {
  router.replace({
    name: 'login',
    query: {
      redirect: router.currentRoute.fullPath
    }
  })
}

export default request